2008年10月17日
川俣晶の縁側ソフトウェア技術雑記 total 3823 count

MinGWでisleadbyteとputcharが両立しない (putcharで2バイト文字が出力できない)

Written By: 川俣 晶連絡先

 MinGW 5.1.4で不可解な挙動に遭遇したのでメモのみ。

 まずCロケールではisleadbyteが機能しません。これはVisual C++のCライブラリも同じで、おそらく意図された通りの挙動。しかし、isleadbyteを機能させるためにsetlocale( LC_ALL, "")でデフォルトのロケール(Japanese_Japan.932)に切り替えると、putchar2回で2バイト文字1つを出力する機能が動作しなくなっています。かといって、2バイト文字が扱えなくなっているわけではなく、printf関数経由では出力できています。

 ちなみに、Visual Studio 2008のCコンパイラを使うとputchar2回でも出力できます。

検証ソース §

#include <stdio.h>

#include <ctype.h>

#include <locale.h>

int main(void)

{

    printf("%s\n",setlocale( LC_ALL, NULL));

    char * buffer = "あ";

    putchar( buffer[0] );

    putchar( buffer[1] );

    printf("\n%d, %s\n",isleadbyte(buffer[0]),buffer);

    printf("%s\n",setlocale( LC_ALL, ""));

    putchar( buffer[0] );

    putchar( buffer[1] );

    printf("\n%d, %s\n",isleadbyte(buffer[0]),buffer);

    return 0;

}

実行結果 §

C

0, あ

Japanese_Japan.932

32768, あ